iT邦幫忙

2024 iThome 鐵人賽

DAY 24
1

Day24. Gin上傳檔案

今天要來介紹如何在Gin中上傳檔案

BTW Gin的官方Docs怎麼都是只有範例,沒有說明各Method怎麼用的。
我真的不習慣看這種Docs,看來我比較習慣看類似fastapi的Docs

首先是單檔案處理,這邊我們透過c.FormFile來取得檔案,這樣我們就得到一個*multipart.FileHeader的物件,這個物件包含了檔案的資訊,例如檔案名稱、檔案大小等等,接著我們就可以透過c.SaveUploadedFile來儲存檔案(記得設定Header中的Content-Typemultipart/form-data)

r.POST("/upload", func(c *gin.Context) {
		file, err := c.FormFile("file")
		if err != nil {
			c.String(400, "Bad Request %s", err.Error())
			return
		}
		fmt.Printf("File %s: size %d(byte)\n", file.Filename, file.Size)
		c.JSON(
			200,
			gin.H{
				"message": "upload success",
				"name":    file.Filename,
				"size":    file.Size,
			},
		)
	})

Image
Image
再來是多檔案處理,首先我們需要先透過c.MultipartForm來進行初始化,接著透過剛才初始化的物件的.File來取得檔案,這樣我們就得到一個[]*multipart.FileHeader的物件,這個物件包含了所有檔案的資訊

type FileInfo struct {
	Name string `json:"name"`
	Size int64  `json:"size"`
	Dest string `json:"saved_to"`
}
r.POST("/uploads", func(c *gin.Context) {
		form, _ := c.MultipartForm()
		files := form.File["file"]
		var fileInfos []FileInfo
		for _, file := range files {
			fmt.Printf("File %s: size %d(byte)\n", file.Filename, file.Size)
			c.SaveUploadedFile(file, fmt.Sprintf("upload/%s", file.Filename))
			fileInfos = append(fileInfos, FileInfo{
				Name: file.Filename,
				Size: file.Size,
				Dest: fmt.Sprintf("upload/%s", file.Filename),
			})
		}
		c.JSON(200, fileInfos)
	})

Image

那麼今天的文章就到這告一段落,如果我的文章有任何地方有錯誤請在留言區反應
明天將會講如何在Gin中架設RESTful API
time

REF


上一篇
Day23. Gin套件介紹與基礎使用
下一篇
Day25. Gin的Middleware
系列文
可以Go一輩子嗎?31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言